//apifox前置加密脚本

let APP_KEY = pm.environment.get("APP_KEY") || "E58032258D900F972102DB5393994941";
var APP_SECRET = pm.environment.get("APP_SECRET") || "BDC12EE7A0FA7DA00DD88CC0A7939B09"
// 存放所有需要用来签名的参数
let param = {}

param["noncestr"] = parseInt(Math.random() * 32769 + 32768, 10);
param["timestamp"] = Date.parse(new Date()) / 1000;
param["appKey"] = APP_KEY;
pm.request.headers.upsert({
    key: 'noncestr',
    value: param["noncestr"]
})
pm.request.headers.upsert({
    key: 'appKey',
    value: APP_KEY
})
pm.request.headers.upsert({
    key: 'timestamp',
    value: param["timestamp"]
})

// 加入 body 参数
if (pm.request.body) {
    let formData
    switch (pm.request.body.mode) {
        case 'formdata':
            formData = pm.request.body.formdata
            break
        case 'urlencoded':
            formData = pm.request.body.urlencoded
            break
        case 'raw':
            // 如果没有 JSON 格式的请求 body，或 JSON 格式 body 不参与签名，可以删除这一段
            let contentType = pm.request.headers.get('content-type')
            if (
                contentType &&
                pm.request.body.raw &&
                contentType.toLowerCase().indexOf('application/json') !== -1
            ) {
                try {
                    let jsonData = JSON.parse(pm.request.body.raw)
                    /*
                     * 注意：通过脚本取出来的接口参数，如果参数包含变量，变量是不会替换成对应的值。如想要获取替换后的值，可使用`pm.variables.replaceIn`方法处理：
                     * let body = pm.variables.replaceIn(pm.request.body.raw);
                     * let jsonData = JSON.parse(body);
                     */
                    for (let key in jsonData) {
                        let value = `${jsonData[key]}` // 此处要注意如果值的实际类型不是 string 需要根据实际情况处理。
                        // 非空参数值的参数才参与签名
                        param[key] = value
                    }
                } catch (e) {
                    console.log('请求 body 不是 JSON 格式')
                }
            }
            break
        default:
            break
    }
    if (formData) {
        formData.each((item) => {
            if (!item.disabled && item.value !== '') {
                // 启用且非空参数值的参数才参与签名
                param[item.key] = item.value
            }
        })
    }
}

// 取 key
let keys = []
for (let key in param) {
    // 注意这里，要剔除掉 sign 参数本身
    if (key !== 'signature') {
        keys.push(key)
    }
}

// 参数名 ASCII 码从小到大排序（字典序）
keys.sort()

// 转成键值对
let paramPair = []
for (let i = 0, len = keys.length; i < len; i++) {
    let k = keys[i]
    paramPair.push(k + '=' + param[k]) // urlencode 编码
}



// 拼接
let stringSignTemp = paramPair.join('&') + APP_SECRET

let sign = CryptoJS.MD5(stringSignTemp).toString()


pm.request.headers.upsert({
    key: 'signature',
    value: sign
})
